/**
 * Copyright (2017, ) Institute of Software, Chinese Academy of Sciences
 * Copyright (2017, ) Bocloud Co,. Lmt
 */
package cn.abcsys.devops.core;

import java.util.List;
import java.util.Properties;

import cn.abcsys.devops.core.application.Instance;

/**
 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
 * @date   May 20, 2017
 *
 */
public interface Application {

	/************************************************
	 * 
	 *                 基本功能
	 *
	 ************************************************/
	/**
	 * 添加应用实例
	 * 
	 * @param instance
	 * @return
	 */
	public Object addInstance(Instance instance);
	
	
	/**
	 * 应用集群规模
	 * 
	 * @return
	 */
	public int getSize();
	
	/**
	 * 删除应用实例
	 * 
	 * @param instance
	 * @return
	 */
	public Object removeInstance(Instance instance);
	
	
	/**
	 * 设置应用名称
	 * 
	 * @param name
	 */
	public void setName(String name);
	
	/**
	 * 获取应用名称
	 * 
	 * @return
	 */
	public String getName();
	
	/**
	 * 应用的唯一标识符
	 * 
	 * @return
	 */
	public String getUUID();
	
	/************************************************
	 * 
	 *                 部署功能
	 *
	 ************************************************/
	/**
	 * 通过runtimeUUID创建应用实例Application
	 * 
	 * @param runtime
	 * @param application
	 * @param props
	 * @return
	 * @throws Exception
	 */
	public Object create(String username, String runtimeUUID, String instanceName, 
							Properties props) throws Exception;
	
	/**
	 * 通过runtimeUUID和具体Host IP，创建应用实例Application
	 * 
	 * @param runtime
	 * @param hostIP
	 * @param application
	 * @param props
	 * @return
	 * @throws Exception
	 */
	public Object create(String username, String runtimeUUID, String hostIP, String instanceName, 
									Properties props) throws Exception;
	
	/**
	 * 通过runtimeUUID启动应用实例Application
	 * 
	 * @param runtime
	 * @param application
	 * @param props
	 * @return
	 * @throws Exception
	 */
	public Object start(String username, String runtimeUUID, String instanceName, 
									Properties props) throws Exception;
	
	/**
	 * 通过runtimeUUID和具体TargetHost，进行应用实例Application的迁移操作
	 * 
	 * @param runtime
	 * @param application
	 * @param targetHost
	 * @return
	 * @throws Exception
	 */
	public Object migrate(String username, String runtimeUUID, String instanceName, 
									String targetHost) throws Exception;
	
	/**
	 * 通过runtimeUUID停止应用实例
	 * 
	 * @param runtime
	 * @param application
	 * @return
	 * @throws Exception
	 */
	public Object stop(String username, String runtimeUUID, String instanceName) throws Exception;
	
	/**
	 * 通过runtimeUUID删除应用实例
	 * 
	 * @param runtime
	 * @param application
	 * @return
	 * @throws Exception
	 */
	public Object delete(String username, String runtimeUUID, String instanceName) throws Exception;
	
	/************************************************
	 * 
	 *                 查询功能
	 *
	 ************************************************/
	/**
	 * 返回所有应用实例UUID的列表
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<String> getAllInstances() throws Exception;
	
	/**
	 * 返回所有应用实例UUID的列表
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<String> getAllInstances(Application.Type type) throws Exception;
	
	/**
	 * 获取运行环境的监测数据，会调用Monitor模块
	 * 为细粒度的Scheduler提供数据支持
	 * 
	 * @return
	 * @throws Exception
	 */
	public Object getMetrics() throws Exception;
	
	/**
	 * 获取应用实例的监测数据，会调用Monitor模块
	 * 
	 * @return
	 * @throws Exception
	 */
	public Object getMetric(String instanceUUID) throws Exception;
	
	/**
	 * 获取应用整体的日志
	 * 
	 * @return
	 * @throws Exception
	 */
	public Object getLogs() throws Exception;
	
	/**
	 * 获取应用实例的日志信息，会调用Logger模块
	 * 比如说Tomcat信息
	 * 
	 * @return
	 * @throws Exception
	 */
	public Object getLogs(String instanceUUID) throws Exception;
	
	/************************************************
	 * 
	 *                 辅助功能
	 *
	 ************************************************/
	/**
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 20, 2017
	 *
	 */
	public static enum Type {
		/**
		 * 非虚拟化方案，主机模式，不支持应用迁移
		 */
		NATIVE,
		/**
		 * 虚拟化方案，可以执行应用在线迁移操作
		 */
		CONTAINER,
		/**
		 * 虚拟化方案，可以执行应用在线迁移操作
		 */
		VMM
	}
	/**
	 * 存储状态
	 * 
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 20, 2017
	 *
	 */
	/**
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 20, 2017
	 *
	 */
	public static enum StorageStatus {
		/**
		 * 本地存储，不支持应用在线迁移
		 */
		LOCAL,
		/**
		 * 共享存储，可以执行应用在线迁移操作
		 */
		SHARED
	}
}
